# -*- coding: utf-8 -*-

CIELO_TESTES_SERVER = 'https://qasecommerce.cielo.com.br/servicos/ecommwsec.do'
CIELO_PROD_SERVER = 'https://ecommerce.cbmp.com.br/servicos/ecommwsec.do'

from datetime import datetime
import httplib
import urllib
import re
from xml.dom.minidom import parse, parseString


class Pyelo():

    '''
    Metodo, provavelmente temporario, para preenchimento do dicionario de dados
    utilizado para gerar a requisicao XML.
    '''
    def preenche_dados(self):
        valores = {}

        ########## DADOS DA LOJA #############
        temp = {}
        #numero de afiliacao da loja com a Cielo (max_length=20)
        temp['numero'] = '1006993069'
        #chave de acesso da loja atribuida pela Cielo (max_length=100)
        temp['chave'] = '25fbb99741c739dd84d7b06ec78c9bac718838630f30b112d033ce2e621b34f3'
        valores['dados-ec'] = temp


        ############### DADOS DO CLIENTE ################
        temp = {}
        #numero do cartao (length=16)
        temp['numero'] = '4551870000000183'
        #validade do cartao (length=6)
        temp['validade'] = '201512' #Dez 2015
        #Indicador do codigo de seguranca: 0 (nao informado), 1 (informado), 2 (ilegivel), 9 (inexistente).
        temp['indicador'] = '9'
        #Obrigatorio se indicador = 1. Para Amex, e obrigatorio e sempre possui 4 posicoes. (length=3|4)
        temp['codigo-seguranca'] = '945'
        #opcional. Nome impresso no cartao. (max_length=50)
        temp['nome-portador'] = 'Jorginho'
        valores['dados-portador'] = temp


        ############## DADOS DO PEDIDO ##################
        temp = {}
        #id do pedido na loja (max_length=20)
        temp['numero'] = '12345678901234567890'
        #valor do pedido (max_length=12)
        temp['valor'] = '1100'
        #codigo numerico da moeda na ISO 4217. Para o Real, o codigo e 986.
        temp['moeda'] = '986'
        #data e hora de envio do pedido (length=19) Exemplo: 2010-07-14T13:56:12
        temp['data-hora'] = datetime.strftime( datetime.now(), "%Y-%m-%dT%H:%M:%S" )
        #descricao do pedido. (Opcional. max_length=1024)
        temp['descricao'] = 'Uma descricao so para nao deixar em branco.'
        #Idioma do pedido: PT (portugues), EN (ingles) ou ES (espanhol).
        #Com base nessa informacao e definida a lingua a ser utilizada nas
        #telas da Cielo. Caso nao preenchido, assume-se PT.
        temp['idioma'] = 'PT'
        valores['dados-pedido'] = temp


        ############## DADOS DO PAGAMENTO ###############
        temp = {}
        #Bandeira: visa, mastercard, amex, diners, discover ou elo (em minusculo)
        temp['bandeira'] = 'visa'
        #codigo do produto: 1 (Credito a Vista), 2 (Parcelado loja), 3 (Parcelado administradora), A (Debito)
        temp['produto'] = '1'
        #numero de parcelas. Para credito a vista ou debito, utilizar 1. (max_length=3)
        temp['parcelas'] = '1'
        valores['forma-pagamento'] = temp


        ############# DADOS "EXTRAS" ####################
        #URL da pagina de retorno. E para essa tela que o fluxo sera
        #retornado ao fim da autenticacao e/ou autorizacao. (length: 1 - 1024)
        valores['url-retorno'] = 'http://testes.dev.doois.com.br/recebe'


        #Indicador de autorizacao automatica:
        #0 (nao autorizar)
        #1 (autorizar somente se autenticada)
        #2 (autorizar autenticada e nao-autenticada)
        #3 (autorizar sem passar por autenticacao � valido somente para credito)
        #Para Amex, Diners, Discover e Elo, o valor sera sempre 3.
        valores['autorizar'] = '3'

        #Define se a transacao sera automaticamente capturada caso seja autorizada.
        #'true ou 'false'
        valores['capturar'] = 'false'

        #campo livre. (0 - 128)
        valores['campo-livre'] = ''

        #Seis primeiros numeros do cartao. (length=6)
        valores['bin'] = valores['dados-portador']['numero'][:6]

        return valores


    '''
    envia o xml para comunicacao com a cielo e retorna a resposta da cielo
    ja convertida para DOM
    '''
    def envia_xml(self, xml):
        print xml
        query = urllib.urlencode({'mensagem':xml})

        f = urllib.urlopen(CIELO_TESTES_SERVER, query)

        contents = f.read()
        print '\n\n\n'+contents
        #transforma a resposta (pagina XML) em DOM
        dom = parseString( contents )
        f.close()

        return dom


    '''
    Gera a requisicao XML com os dados armazenados no dicionario "valores".
    '''
    def gera_xml(self, valores):

        xml = '<?xml version="1.0" encoding="ISO-8859-1"?>\n'
        xml += '<requisicao-transacao id="1" versao="1.1.1">\n\n'

        xml += '<dados-ec>\n'
        xml += '\t<numero>'+valores['dados-ec']['numero']+'</numero>\n'
        xml += '\t<chave>'+valores['dados-ec']['chave']+'</chave>\n'
        xml += '</dados-ec>\n'

        xml += '<dados-portador>\n'
        xml += '\t<numero>' + valores['dados-portador']['numero'] + '</numero>\n'
        xml += '\t<validade>' + valores['dados-portador']['validade'] + '</validade>\n'
        xml += '\t<indicador>' + valores['dados-portador']['indicador'] + '</indicador>\n'
        xml += '\t<codigo-seguranca>' + valores['dados-portador']['codigo-seguranca'] + '</codigo-seguranca>\n'
        xml += '\t<nome-portador>' + valores['dados-portador']['nome-portador'] + '</nome-portador>\n'
        xml += '</dados-portador>\n'


        xml += '<dados-pedido>\n'
        xml += '\t<numero>' + valores['dados-pedido']['numero'] + '</numero>\n'
        xml += '\t<valor>' + valores['dados-pedido']['valor'] + '</valor>\n'
        xml += '\t<moeda>' + valores['dados-pedido']['moeda'] + '</moeda>\n'
        xml += '\t<data-hora>' + valores['dados-pedido']['data-hora'] + '</data-hora>\n'
        xml += '\t<descricao>' + valores['dados-pedido']['descricao'] + '</descricao>\n'
        xml += '\t<idioma>' + valores['dados-pedido']['idioma'] + '</idioma>\n'
        xml += '</dados-pedido>\n'


        xml += '<forma-pagamento>\n'
        xml += '\t<bandeira>' + valores['forma-pagamento']['bandeira'] + '</bandeira>\n'
        xml += '\t<produto>' + valores['forma-pagamento']['produto'] + '</produto>\n'
        xml += '\t<parcelas>' + valores['forma-pagamento']['parcelas'] + '</parcelas>\n'
        xml += '</forma-pagamento>\n\n'


        xml += '<url-retorno>' + valores['url-retorno'] + '</url-retorno>\n'
        xml += '<autorizar>' + valores['autorizar'] + '</autorizar>\n'
        xml += '<capturar>' + valores['capturar'] + '</capturar>\n'
        xml += '<campo-livre>' + valores['campo-livre'] + '</campo-livre>\n'
        xml += '<bin>' + valores['bin'] + '</bin>\n'

        xml += '</requisicao-transacao>'

        return xml



def main():
    
    t = Pyelo()

    #recebe os dados preenchidos
    valores = t.preenche_dados()

    #gera a requisicao xml
    xml = t.gera_xml(valores)
    #xml = xml.encode('ISO-8859-1')
    #envia a requisicao xml e recebe a resposta convertida para DOM
    dom = t.envia_xml(xml)



    '''
    #recupera os dados necessarios do DOM
    values = {'status':'', 'valor_sedex':'', 'valor_pac':''}
    for key in values.keys():
        try:
            values[key] = dom.getElementsByTagName(key)[0].childNodes[0].nodeValue
        except:
            pass

    if values['status'] != 'OK':
        raise Exception( values['status'] )

    return {'pac': values['valor_pac'], 'sedex': values['valor_sedex']}
    '''
if __name__ == "__main__":
    main()
